#利用RawData得到的数据建立解释变量和预报变量，解释变量和预报变量统一在XYdata中，并保存到data/database目录下

'''关于预报变量
依次按照以下4个原则进行排序（这个地方值得我们讨论一下，下面只是我写的一个模板）
- 平均做题总时间越少越简单（剔除掉没做这道题的学生）、
- 平均学生最大提交次数越少越简单（剔除掉没做这道题的学生）、
- 平均代码字符数越少越简单（剔除掉没做这道题的学生）、
- 做题总人数越多越简单
'''
'''关于解释变量

'''
import urllib.request
import urllib.parse
import util.file as RF
import string
import zipfile
import os
import util.IO as RI
class XYdata:


    def __init__(self):
        self.__dataPath = RF.getRootPath() + 'data\dataBase\storageGxy.csv'
        self.__rootZips = RF.getRootPath() + 'data\dataBase\cases\zips\\'
        self.__expData=[]#解释变量二维数组，每一行为一个样本的所有解释变量，其中zipUrl将在downAndUnzip方法中处理
        self.__caseNames=[]
        self.__readMes=[]
        data = RF.read(self.__dataPath, gap='\\')
        for i in range(1, data.__len__()):
            if (data[i].__len__() != 1):
                try:
                    readmePath = self.__rootZips + os.path.basename(data[i][2])[:-4] + '\\readme.md'
                    readme = RF.read(readmePath)
                    self.__expData.append(data[i])
                    self.__caseNames.append(os.path.basename(data[i][2]))
                    self.__readMes.append(readme)
                except:
                    pass
        self.__sampleSize=self.__expData.__len__()#样本容量

    def down(self,url,fileName):

        url = urllib.request.quote(url, safe=string.printable)
        urllib.request.urlretrieve(url, self.__rootZips + fileName+'.zip')

    def downAndUnzip(self):
        for i in range(self.__sampleSize):
            self.down(self.__expData[i][2],self.__expData[i][0])
            ziPath = self.__rootZips + self.__caseNames[i]
            direZip = zipfile.ZipFile(ziPath)  # 打开下载的zip文件
            direZip.extractall(ziPath[:-4])  # 压缩包中还有一个压缩包 解压到对应路径（默认为dataBase/all-upload）
            RI.progressBar(i, self.__sampleSize,'正在下载题目数据并解压:')
        print()
    def getReadMe(self):
        for i in range(self.__sampleSize):
            add=""
            for j in range(self.__readMes[i].__len__()):
                    item=self.__readMes[i][j][0]
                    if RF.is_contain_chinese(item) and item[0]!='#':
                        add=add+item+','

            self.__expData[i].append(add)

    def getReadMe2(self):
        newData=[]
        for i in range(self.__sampleSize):
            newLine=[]
            case = ""
            input = ""
            output = ""
            now = 0
            for item in self.__readMes[i]:
                if item[0]!='' and item[0]!='```':
                    if item[0]=='### 题目描述' or item[0]=='## 题目描述':
                        now=0
                    elif item[0]=='### 输入描述' or item[0]=='## 输入描述':
                        now=1
                    elif item[0]=='### 输出描述' or item[0]=='## 输出描述':
                        now=2
                    elif item[0]=='### 测试样例' or item[0]=='## 测试样例' or item[0]=='## 样例输入':
                        now=-1
                    else:
                        if now==0:
                            case=case+item[0]
                        elif now==1:
                            input=input+item[0]
                        elif now==2:
                            output=output+item[0]
                        elif now==-1:
                            pass
            newLine.append(self.__expData[i][0])
            newLine.append(case)
            newLine.append(input)
            newLine.append(output)
            newData.append(newLine)
            print(newLine)
        RF.write(RF.getRootPath()+'data\dataBase\storage.csv',self.__expData,gap='\\')

    def save(self):
        RF.write(RF.getRootPath()+'data\dataBase\storageWrq.csv',self.__expData,gap='\t')
    def reWriteReadme(self):
        for i in range(self.__sampleSize):
            readmePath = self.__rootZips + os.path.basename(self.__expData[i][2])[:-4] + '\\readme.md'
            writePath=RF.getRootPath()+'data\dataBase\storageCases\\'+self.__expData[i][0]+'.md'
            with open(readmePath,'r',encoding='utf-8') as f:
                with open(writePath,'w',encoding='utf-8') as ff:
                    ff.write(f.read())
            RI.progressBar(i,self.__sampleSize)



